﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using LiquidacionComisionREST.Persistencia;
using LiquidacionComisionREST.Dominio;
using System.Net;
using LiquidacionComision.Dominio;

namespace LiquidacionComisionREST
{
    public class CategoriasImpl : ICategorias
    {
        private CategoriaDAO dao =  new CategoriaDAO();

        public Categoria RegistrarCategoria(string codigo, string nombre, string precio) { 

            //El código es obligatorio
            if (codigo == null || codigo == string.Empty)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.CODIGO_OBLIGATORIO }, HttpStatusCode.InternalServerError);
            }

            //El nombre es obligatorio
            if (nombre == null || nombre == string.Empty)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.NOMBRE_OBLIGATORIO }, HttpStatusCode.InternalServerError);
            }

            //El precio es obligatorio
            if (precio == null || precio == string.Empty)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.PRECIO_OBLIGATORIO }, HttpStatusCode.InternalServerError);
            }

            //Verifica si el precio es un número
            float fprecio = 0;
            bool fnumero = float.TryParse(precio, out fprecio);
            if (!fnumero) {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.PRECIO_NUMERO }, HttpStatusCode.InternalServerError);
            }

            //Verifica que la categoria no exista
            if (dao.Obtener(codigo)!=null) {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.CATEGORIA_EXISTE }, HttpStatusCode.InternalServerError);
            }
           
            Categoria categoria = new Categoria();
            categoria.Codigo = codigo;
            categoria.Nombre = nombre;
            categoria.Precio = float.Parse(precio);

            return dao.Crear(categoria);
        }

        public Categoria ModificarCategoria(string codigo, string nombre, string precio)
        {

            //El código es obligatorio
            if (codigo == null || codigo == string.Empty)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.CODIGO_OBLIGATORIO }, HttpStatusCode.InternalServerError);
            }

            //El nombre es obligatorio
            if (nombre == null || nombre == string.Empty)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.NOMBRE_OBLIGATORIO }, HttpStatusCode.InternalServerError);
            }

            //El precio es obligatorio
            if (precio == null || precio == string.Empty)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.PRECIO_OBLIGATORIO }, HttpStatusCode.InternalServerError);
            }

            //Verifica si el precio es un número
            float fprecio = 0;
            bool fnumero = float.TryParse(precio, out fprecio);
            if (!fnumero)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.PRECIO_NUMERO }, HttpStatusCode.InternalServerError);
            }

            //Verifica que la categoria exista para ser modificada
            if (dao.Obtener(codigo) == null)
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.CATEGORIA_NO_EXISTE }, HttpStatusCode.InternalServerError);
            }
           

            Categoria categoria = new Categoria();
            categoria.Codigo = codigo;
            categoria.Nombre = nombre;
            categoria.Precio = float.Parse(precio);
            return dao.Modificar(categoria);
        }

        public Categoria ObtenerCategoria(string codigo)
        {
            Categoria categoria = null;
            try
            {
                categoria = dao.Obtener(codigo);
            }
            catch (Exception)
            {
                categoria = null;
            }
            return categoria;
        }

        public List<Categoria> ListarCategorias(string codigo, string nombre)
        {
            List<Categoria> lstCategorias = new List<Categoria>();
            try
            {
                lstCategorias = dao.listarCategorias(codigo, nombre);
            }
            catch (Exception)
            {
                lstCategorias = new List<Categoria>();
            }
            return lstCategorias;
        }

        public List<Categoria> ListarTodos()
        {
            return ListarCategorias(string.Empty, string.Empty);
        }

        public List<Categoria> ListarCategoriasPorNombre(string nombre)
        {
            return ListarCategorias(string.Empty, nombre);
        }

        public List<Categoria> ListarCategoriasPorCodigo(string codigo)
        {
            return ListarCategorias(codigo, string.Empty);
        }        

        public string EliminarCategoria(string codigo)
        {
            String resultado = string.Empty;
            Categoria categoria = dao.Obtener(codigo);

            //Eliminar una categoria existente
            if (categoria == null)
            {                    
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.NO_EXISTE_CATEGORIA }, HttpStatusCode.InternalServerError);
            }

            //Validar que la categoría no se utilice por un agente
            if (dao.validarUsoCategoria(codigo))
            {
                throw new WebFaultException<ValidationException>(new ValidationException { ValidationError = Constantes.CATEGORIA_EN_USO }, HttpStatusCode.InternalServerError);
            }
            dao.Eliminar(categoria);
            resultado = Constantes.PROCESO_CORRECTO; 
            return resultado;
        }

    }
}
